

package com.hazelcast.client.impl.spi;

import com.hazelcast.internal.nio.Connection;
import com.hazelcast.internal.serialization.Data;
import com.hazelcast.partition.Partition;

import javax.annotation.Nonnull;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * Partition service for Hazelcast clients.
 * <p>
 * Allows to retrieve information about the partition count, the partition owner or the partitionId of a key.
 */
public interface ClientPartitionService {

    /**
     * Updates the partition table with the new partition table information.
     * <p>
     * Note: The partitions can be empty on the response, client will not apply the empty partition table.
     *
     * @param connection            the connection which the partition table is received from
     * @param partitions            the partition table
     * @param partitionStateVersion the version of the partition table
     */
    void handlePartitionsViewEvent(Connection connection, Collection<Map.Entry<UUID, List<Integer>>> partitions, int partitionStateVersion);

    /**
     * @return the owner of the partition or null if a partition is not assigned yet
     */
    UUID getPartitionOwner(int partitionId);

    /**
     * @return the partition id associated with given data
     * @throws com.hazelcast.spi.exception.RetryableHazelcastException if partition table is not arrived yet
     */
    int getPartitionId(@Nonnull Data key);

    /**
     * @return the partition id associated with given Object
     * @throws com.hazelcast.spi.exception.RetryableHazelcastException if partition table is not arrived yet
     */
    int getPartitionId(@Nonnull Object key);

    /**
     * If partition table is not fetched yet, this method returns zero
     *
     * @return the partition count
     */
    int getPartitionCount();

    Partition getPartition(int partitionId);

}
